package main

import (
	"fmt"
	"strings"
)

// 1. 递归函数计算阶乘
func factorial(n int) int {
	// 递归终止条件：当 n 等于 0 或 1 时，阶乘为 1
	if n == 0 || n == 1 {
		return 1
	}
	// 递归调用：n 的阶乘等于 n 乘以 (n-1) 的阶乘
	return n * factorial(n-1)
}

// for循环方法
func factorial1(n int) int {
	result := 1
	for i := 2; i <= n; i++ {
		result *= i
	}
	return result
}

func Upper_triangular(x int) {
	for i := 1; i <= x; i++ {
		//fmt.Printf("%d\n", i)
		for j := 1; j <= i; j++ {
			//for j := i; j >= 1; j-- {
			fmt.Printf("%d\t", j) //差空格
		}
		fmt.Println()
	}
}

// 2. 递归函数计算阶乘
func Anticlinally_upward(x int) {
	for i := 1; i <= x; i++ {
		for k := x; k > i; k-- {
			fmt.Printf(" ")
		}
		for j := i; j >= 1; j-- {
			fmt.Printf("%d", j)
		}
		fmt.Println()
	}
}

func main() {

	// 调用 factorial 函数计算阶乘
	n := 5
	result := factorial(n)
	fmt.Printf("%d 的阶乘是 %d\n", n, result)
	fmt.Printf("%d 的阶乘是 %d\n", n, factorial1(n))
	fmt.Println(strings.Repeat("=", 30))
	x := 5
	Upper_triangular(x)
	fmt.Println(strings.Repeat("=", 30))
	Anticlinally_upward(5)

}

//3、简述defer作用和应用场景
//defer 意思是推迟，defer 语句会延迟函数的执行直到上层函数返回。 defer 语句会将函数推迟到外层函数返回之后执行。
//defer 语句经常被用于处理成对的操作，数据库,网络、关闭、连接、断开连接、加锁、释放锁、输出、记录日志等。
